/**
 * @file connection.h
 * @brief Short description of this file.
 *
 * Complete description of this file.
 *
 * @date Apr 20, 2012
 * @author Francesco Corvino
 */

#ifndef CONNECTION_H_
#define CONNECTION_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include "../MemObj/hiddenType.h"

typedef struct addrinfo AddressInfo;

typedef struct sockaddr Address;

/**
 * @brief Struttura che specifica le principali informazioni di una connessione.
 *
 * Sono specificati una serie di parametri generali, utilizzati per le operazioni che
 * necessariamente devono essere svolte per avviare una connessione, ed è specificato un oggetto
 * @c HiddenType @c dataProtocol per permettere l'estensione delle configurazioni, lasciando la possibilità
 * ai vari protocolli di specificare le altre caratteristiche dell'oggetto.
 */
typedef struct {

	char* address;/**< Stringa dell'indirizzo della connessione */
	char* port;/**< Stringa della porta */

	int sd;/**< Socket aperto per la connessione */
	Address addr; /**< L'indirizzo a cui ci si sta connettendo. */

	HiddenType dataProtocol;

	int protocolType; /**< Identificazione univoca del tipo di comunicazione */
} Connection;

/**
 * @brief Funzione che avvia le operazioni di inizializzazione di una conessione
 *
 * @param c Connessione da inizializzare, l'elemento deve essere già allocato in memoria.
 * @param addr stringa dell'indirizzo dove collegarsi.
 * @param port porta della connessione.
 */
void Connection_init(Connection *c, char *addr, char *port);

/**
 * @brief Elimina la memoria allocata per una connessione.
 *
 * @param c connessione.
 */
void Connection_destroy(Connection *c);

#endif /* CONNECTION_H_ */
